package fed

import (
	"database/sql"
	"github.com/google/wire"
	"time"
)

type DBConfig struct {
	DSN      string
	MaxConns int
}

type AppConfig struct {
	DB      DBConfig
	Timeout time.Duration
}

type App struct {
	DB      *sql.DB
	Timeout time.Duration
}

func NewApp(db *sql.DB, timeout time.Duration) *App {
	return &App{DB: db, Timeout: timeout}
}

// Wire 集合
var appSet = wire.NewSet(
	// wire.FieldsOf 是 Google Wire 依赖注入工具中的一个高级功能，它允许你将一个结构体的字段作为依赖项提供给 Wire，而不需要显式地为每个字段编写提供者函数。
	/*
		 使用注意事项
			字段必须是导出的（首字母大写）
			字段名必须正确拼写
			结构体本身需要先被提供（通过另一个提供者或绑定）
			可以一次指定多个字段
	*/
	wire.FieldsOf(new(AppConfig), "DB", "Timeout"),
	wire.FieldsOf(new(DBConfig), "DSN", "MaxConns"),
	sql.Open, // 假设有提供者函数 func Open(dsn string, maxConns int) (*sql.DB, error)
	NewApp,
)
